package controllers;

import models.Collection;

import org.apache.commons.lang.StringUtils;

import play.Logger;
import play.cache.Cache;
import play.data.validation.Error;
import play.data.validation.Valid;
import play.data.validation.Validation;
import play.mvc.Controller;
import utils.Constants;

public class CollectionMngt extends Controller {

    public static void index() {
        render();
    }
    
    
    public static void addCollectionForm(final String from) {
    	Cache.set(Security.getSessionId() + Constants.FROM_KEY_CALL_ADDCOLLECTION, from, "30mn");
    	render();
    }
    
    /**
     * Add the collection.
     * @throws Throwable 
     */
    public static void addCollection(@Valid final Collection collection) throws Throwable {
    	
    	String from = (String) Cache.get(Security.getSessionId() + Constants.FROM_KEY_CALL_ADDCOLLECTION);
    	
    	if (Validation.hasErrors()) {
    		internalPerformError();
    		addCollectionForm(from);
    	} 
    	
    	// create collection
    	collection.create();
    	
    	if (StringUtils.isNotEmpty(from)) {
    		if (BookMngt.FROM_ADDING_FORM.equals(from)) {
    			String from2 = (String) Cache.get(Security.getSessionId() + Constants.FROM_KEY_CALL_ADDBOOK);
    			BookMngt.addForm(from2);
    			//TODO garder dans le cache ou en session les trucs saisis avant dans la fiche
    		} else if (CartoonMngt.FROM_ADDING_FORM.equals(from)) {
    			String from2 = (String) Cache.get(Security.getSessionId() + Constants.FROM_KEY_CALL_ADDCARTOON);
    			CartoonMngt.addForm(from2);
    			//TODO garder dans le cache ou en session les trucs saisis avant dans la fiche
    		} else {
    			error("Je sais pas où est : " + from);
    		}
    	} else {
    		error("Je ne sais pas d'où je viens");
    	}
    }
    
    
    private static void internalPerformError() {
    	
		if (Logger.isDebugEnabled()) {
			Logger.debug("Erreur trouvée dans création collectiob");
			for (Error err : Validation.errors()) {
				Logger.debug(err.message() + " --> pour le champ " + err.getKey());
			}
		}
		
		params.flash(); // add http parameters to the flash scope
		validation.keep(); // keep the errors for the next request
    
    }
    
    
    public static void bookInCollection(final Long collectionId) {
    	
    	Collection collection = Collection.find("select c from Collection c " +
    			"join fetch c.books b " +
    			"where c.id = ? " +
    			"order by b.volume", collectionId).first();
    	
    	Collection collection2 = Collection.find("select c from Collection c " +
    			"join fetch c.cartoons b " +
    			"where c.id = ? " +
    			"order by b.volume", collectionId).first();
    	
    	render(collection, collection2);
    }

}
